package com.cy.java.oop;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Point{
    private int x;
    private int y;
    public Point(int x,int y){
        this.x=x;
        this.y=y;
    }

    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class ReflectTests {
    public static void main(String[] args) throws Exception{
        //作业:
        //1.通过反射构建Point类型的实例对象
        //1.1获取反射应用的起点对象（类的字节码对象)
        Class c1=Class.forName("com.cy.java.oop.Point");
        Constructor constructor=c1.getConstructor(int.class,int.class);
        Object o=constructor.newInstance(10,20);
        System.out.println(o);
        //point.setX(100);//自己手动复制
        //point.setY(200);

//        Class c=Point.class;
//        Object o=c.newInstance();
//        System.out.println(o);

//        //2.通过反射为point类实例的属性直接赋值
        Field f1=c1.getDeclaredField("x");
        System.out.println(f1.isAccessible());//查看该字段的访问权限
        f1.setAccessible(true);//设置可访问
        System.out.println(f1.isAccessible());
        f1.set(o,1000);//为point对象的f1属性值赋值
        System.out.println(o);
//        Field f=c.getField("x");
//        f.set(o,11);
//        System.out.println(f.get(o));
//        Field f2=c.getField("y");
//        f.set(o,22);
//        System.out.println(f.get(o));
//
//        //3.通过反射调用point类的实例方法为属性赋值
        Method setMethod=c1.getDeclaredMethod("setX", int.class);
        setMethod.invoke(o,2000);
        System.out.println(o);

//        Method m=c.getMethod("setX", int.class);
//        Method m2=c.getMethod("setY", int.class);
//        m.invoke(o,111);
//        m.invoke(o,222);
//
//        //4.通过反射调用point类的get方法获取属性值.
        Method getMethod=c1.getDeclaredMethod("getX");
        Object getResult= getMethod.invoke(o);
        System.out.println(getResult);
//       Field f3=c.getField("x");
//        System.out.println(f3.get(o));
//        System.out.println("");
    }
}
